package org.xenon.vote.util;

import org.xenon.vote.model.pojo.po.Judge;
import org.xenon.vote.service.JudgeService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Converter {

    /**
     * 将一个裁判列表转换成一个裁判名字列表
     * @param judges 裁判列表
     */
    public static List<String> judgeToString(List<Judge> judges) {
        List<String> res = new ArrayList<>();
        if(judges == null) return null;
        for (Judge j : judges)
            res.add(j.getName());
        return res;
    }

    /**
     * 把一个字符串转换为{@code HashMap<Integer, String>}格式
     *
     * @param material 多行的字符串, 每一行对应Map的一个元素, 键和值用空格分开
     * @return 转换的结果
     */
    public static HashMap<Integer, String> toIntMap(String material) {
        return toIntMap(material, "\n", " ");
    }

    /**
     * 把一个字符串转换为{@code HashMap<Integer, String>}格式
     *
     * @param material  多行的字符串, 按指定的格式分割
     * @param keyRegex  键和值之间的分隔符
     * @param lineRegex 键值对之间的分隔符
     * @return 转换的结果
     */
    public static HashMap<Integer, String> toIntMap(String material, String lineRegex, String keyRegex) {
        String[] list = material.split(lineRegex);
        HashMap<Integer, String> map = new HashMap<>();
        String[] tmp;
        for (String s : list) {
            tmp = s.split(keyRegex);
            map.put(Integer.valueOf(tmp[0]), tmp[1]);
        }
        return map;
    }

    /**
     * 把一个字符串转换为{@code HashMap<String, String>}格式
     *
     * @param material 多行的字符串, 每一行对应Map的一个元素, 键和值用空格分开
     * @return 转换的结果
     */
    public static HashMap<String, String> toJudgeMap(String material) {
        return toJudgeMap(material, "\\*", "@");
    }

    /**
     * 把一个字符串转换为{@code HashMap<String, String>}格式
     * @param material 一个字符串, 包含数个judge的名字, 彼此之间用@分割
     */
    public static HashMap<String, String> toJudgeMapNameOnly(String material, JudgeService judgeService, String owner){
        HashMap<String, String> map = new HashMap<>();
        String[] judges = material.split("@");
        for (String s : judges)
            map.put(s, judgeService.get(s, owner).getPassword());
        return map;
    }

    /**
     * 把一个字符串转换为{@code HashMap<String, String>}格式
     *
     * @param material  多行的字符串, 按指定的格式分割
     * @param keyRegex  键和值之间的分隔符
     * @param lineRegex 键值对之间的分隔符
     * @return 转换的结果
     */
    public static HashMap<String, String> toJudgeMap(String material, String lineRegex, String keyRegex) {
        String[] list = material.split(lineRegex);
        HashMap<String, String> map = new HashMap<>();
        String[] tmp;
        for (String s : list) {
            tmp = s.split(keyRegex);
            map.put(tmp[0], tmp[1]);
        }
        return map;
    }
}
